#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
#include <QProcess>
#include <QSocketNotifier>
#include "OutputReader.h"
#include <QThread>
#include <QFrame>
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QFileDialog>
#include <QHBoxLayout>
#include <QDir>
#include <QProcess>
#include <QRegularExpression>  // 添加此行
#include <QTimer>
#include <QStatusBar>
#include <QLabel>
#include <QApplication>
#define COLOR_RED "#EB3324"
#define COLOR_GREEN "#5EF926"
#define COLOR_YELLOW "#FFFD55"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

    void handleOutput1(const QByteArray &output); // 处理第一个程序的输出

    void on_DO_Path_pushButton_clicked();

    void on_dev_DO_pushButton_clicked();

    void on_pushButtonDO_Set_clicked();

    void on_lineEdit_3_cursorPositionChanged(int arg1, int arg2);

    void on_lineEdit_4_cursorPositionChanged(int arg1, int arg2);

    void on_lineEdit_2_cursorPositionChanged(int arg1, int arg2);

    void on_lineEditDO_cursorPositionChanged(int arg1, int arg2);

    void on_pushButton_3_clicked();

    void on_pushButtonDI_Set_clicked();

    void on_dev_DI_pushButton_clicked();

    void on_pushButton_clicked();

    void on_stopButton_clicked();

    void on_pushButton_9_clicked();

private:
    Ui::MainWindow *ui;
    QProcess *process1; // 第一个循环程序
    QThread thread1; // 第一个程序的读取线程
    OutputReader *reader1; // 第一个程序的输出读取器
    void startProcessWithDirectory(QProcess *process, OutputReader *reader, QThread *thread, const QString &workingDirectory, const QString &program, const QStringList &arguments);
    void stopProcess(QProcess *process, OutputReader *reader, QThread *thread);
    void processOutput(const QByteArray &output); // 处理输出内容
/////////////////////////////////////

    QString devDO ;//驱动
    QString devDI ;//驱动
    QString comDO ;//文件名
    QString pathDI;//路径
    QString pathDO;//文件路径

    int DO_num1;//DO通道
    int DO_num2;//DO电平

    int DI_num1;//DI通道
    int DI_num2;//DI电平

    int FF;//停止标志位
///////////////////////////
private:
    QString generateLog(int currentBit, const QVector<bool>& doStates, const QVector<bool>& diStates, bool highIsCorrect);//调试日志逻辑
    bool areAllStatesTrue(const QVector<bool>& doStates);
    QString SerialNumber;  //板卡编号
    QString TextLog;       //测试日志

   QLabel *statusLabel; // 声明 QLabel 指针

    QStringList errorList;  // 用于存储错误消息的列表


    void appendText(const QString &text);
    void finishAppending();
};
#endif // MAINWINDOW_H
